package demo3

import (
	"context"
	"fmt"
	"local/service_manager"
	"time"
)

// ScheduleService 定义计划任务服务结构
type ScheduleService struct {
	name        string
	description string
	lastError   *service_manager.ServiceError
	tasks       []Task
}

// Task 定义计划任务结构
type Task struct {
	Name     string
	Interval time.Duration
	Execute  func() error
	LastRun  time.Time
}

// NewScheduleService 创建新的计划任务服务实例
func NewScheduleService() *ScheduleService {
	s := &ScheduleService{
		name:        "new_mail_service",
		description: "有度插件 - 定时检查新邮件",
	}

	// 注册示例任务
	s.tasks = []Task{
		{
			Name:     "每30秒任务",
			Interval: 30 * time.Second,
			Execute: func() error {
				fmt.Printf("[%s] 执行30秒任务\n", time.Now().Format("15:04:05"))
				return nil
			},
		},
		{
			Name:     "每分钟任务",
			Interval: time.Minute,
			Execute: func() error {
				fmt.Printf("[%s] 执行每分钟任务\n", time.Now().Format("15:04:05"))
				return nil
			},
		},
		{
			Name:     "每5分钟任务",
			Interval: 5 * time.Minute,
			Execute: func() error {
				fmt.Printf("[%s] 执行5分钟任务\n", time.Now().Format("15:04:05"))
				return nil
			},
		},
	}

	return s
}

// GetName 获取服务名称
func (s *ScheduleService) GetName() string {
	return s.name
}

// GetDescription 获取服务描述
func (s *ScheduleService) GetDescription() string {
	return s.description
}

// GetDependencies 获取服务依赖
func (s *ScheduleService) GetDependencies() []string {
	return nil
}

// GetLastError 获取最后一次错误
func (s *ScheduleService) GetLastError() *service_manager.ServiceError {
	return s.lastError
}

// OnStart 服务启动前的初始化
func (s *ScheduleService) OnStart(ctx context.Context) error {
	fmt.Printf("[%s] 计划任务服务启动，已注册 %d 个任务\n",
		time.Now().Format("15:04:05"),
		len(s.tasks))
	return nil
}

// Entry 服务入口函数
func (s *ScheduleService) Entry(ctx context.Context) error {
	ticker := time.NewTicker(time.Second)
	defer ticker.Stop()

	for {
		select {
		case <-ctx.Done():
			return nil
		case now := <-ticker.C:
			// 检查每个任务是否需要执行
			for i := range s.tasks {
				task := &s.tasks[i]
				if now.Sub(task.LastRun) >= task.Interval {
					// 在新的 goroutine 中执行任务
					go func(t *Task) {
						if err := t.Execute(); err != nil {
							s.lastError = &service_manager.ServiceError{
								Time:    time.Now(),
								Message: fmt.Sprintf("任务 %s 执行失败", t.Name),
								Details: err.Error(),
							}
							fmt.Printf("[%s] 任务 %s 执行失败: %v\n",
								time.Now().Format("15:04:05"),
								t.Name,
								err)
						}
					}(task)
					task.LastRun = now
				}
			}
		}
	}
}

// OnStop 服务停止前的清理
func (s *ScheduleService) OnStop(ctx context.Context) error {
	fmt.Printf("[%s] 计划任务服务正在停止...\n",
		time.Now().Format("15:04:05"))
	return nil
}
